As we have already noted, RichFaces (RF) is just a component library for JavaServer Faces (JSF). Therefore, everything said in the Basic JSF Portlet Development chapter applies here too.    
    
        Example Code
    
    
This section cites code from JSF2+RF4 Hello World Portlet from the GateIn Portal Quickstarts  collection.    
    
        pom.xml
    
    
We need to add several RF-specific dependencies to the general JSF ones:    
    
                    pom.xml
                
        068.     <dependencies>
069.         <!-- 
070.             The versions, scopes and types of these dependencies are managed in gatein-*-bom.
071.             You need to name only groupId and artifactId here.
072.             Name only those artifacts you refer to in your code.
073.             Look at gatein-*-bom POM file for the complete list of available artifacts.
074.         -->
075.         <!-- General JSF dependencies -->
076.         <dependency>
077.             <groupId>org.jboss.spec.javax.faces</groupId>
078.             <artifactId>jboss-jsf-api_2.1_spec</artifactId>
079.         </dependency>
080.         <dependency>
081.             <groupId>org.jboss.portletbridge</groupId>
082.             <artifactId>portletbridge-api</artifactId>
083.         </dependency>
084. 
085.         <!-- RF-sprecific dependencies -->
086.         <dependency>
087.             <groupId>org.jboss.portletbridge</groupId>
088.             <artifactId>portletbridge-extension-richfaces</artifactId>
089.         </dependency>
090.         <dependency>
091.             <groupId>org.richfaces.ui</groupId>
092.             <artifactId>richfaces-components-api</artifactId>
093.         </dependency>
094.         <dependency>
095.             <groupId>org.richfaces.ui</groupId>
096.             <artifactId>richfaces-components-ui</artifactId>
097.         </dependency>
098.         <dependency>
099.             <groupId>org.richfaces.core</groupId>
100.             <artifactId>richfaces-core-impl</artifactId>
101.         </dependency>
102.     </dependencies>
         
     
     
    
    
        JSF Template Files
    
    
We use <rich:*> components in the templates:    
    
                    Form with rich: components in main.xhtml
                
        43.         </p>
44.         <h:form id="jsf2HelloWorldPortlet">
45.             <h:panelGrid columns="2">
46.                 <h:outputLabel value="#{msgs.Greeting}" for="greeting"/>
47.                 <rich:select id="greeting" value="#{helloBean.greeting}">
48.                     <f:selectItems value="#{helloBean.greetings}" />
49.                     <f:ajax render="output" event="selectitem"/>
50.                 </rich:select>
51.                 
52.                 <h:outputLabel value="#{msgs.Name}" for="nameInput"/>
53.                 <h:inputText id="nameInput" value="#{helloBean.name}">
54.                     <f:validateLength minimum="1" maximum="50" />
55.                     <f:ajax render="output" event="keyup"/>
56.                 </h:inputText>
57.             </h:panelGrid>
58.             <p>
59.                 <h:panelGroup id="output">
60.                     <strong><h:outputText value="#{helloBean.greeting} #{helloBean.name}!" rendered="#{not empty helloBean.name}"/></strong>
61.                 </h:panelGroup>
62.             </p>
63.             <p>
64.                 <h:commandButton id="reset" value="#{msgs.Reset}" actionListener="#{helloBean.reset}">
65.                     <f:ajax render="@form" />
66.                 </h:commandButton> - #{msgs.ResetComment}
67.             </p>
68.             <p>
69.                 <h:commandButton id="reload" value="#{msgs.Reload}" /> - #{msgs.ReloadComment}
70.             </p>
         
     
    
The complete source code of the above template can be found in src/main/webapp/pages/main.xhtml of JSF2+RF4 Hello World Portlet quickstart.    
     
    
    
        Java Beans
    
    
The HelloBean presented in the Basic JSF Portlet Development chapter was extended firstly to provide a list of greeting phrases selectable in the drop-down box on the main.xhtml page and secondly to be able to store the greeting phrase selected in the drop-down box.    
    
                    HelloBean.java
                
        039.     /**
040.      * Static list of greetings. Contains {@code "Hello"} and {@code "Hi"}.
041.      */
042.     private static final List<SelectItem> GREETINGS;
043. 
044.     static {
045.         List<SelectItem> l = new ArrayList<SelectItem>(2);
046.         l.add(new SelectItem("Hello"));
047.         l.add(new SelectItem("Hi"));
048.         GREETINGS = Collections.unmodifiableList(l);
049.     }
050. 
051.     /**
052.      * Stores the greeting phrase which will be used to greet the application user.
053.      */
054.     private String greeting;
         
     
    
                    HelloBean.java
                
        088.     /**
089.      * Returns {@link #greeting}.
090.      * 
091.      * @return {@link #greeting}
092.      */
093.     public String getGreeting() {
094.         return greeting;
095.     }
096. 
097.     /**
098.      * Set {@link #greeting}.
099.      * 
100.      * @param greeting
101.      */
102.     public void setGreeting(String greeting) {
103.         this.greeting = greeting;
104.     }
105. 
106.     /**
107.      * Returns {@link #GREETINGS}.
108.      * 
109.      * @return {@link #GREETINGS}
110.      */
111.     public List<SelectItem> getGreetings() {
112.         return GREETINGS;
113.     }
114. 
115. 
116.     /**
117.      * Resets {@link #name} to the default value {@code "World"} and {@link #greeting} with the default value {@code "Hello"}.
118.      * 
119.      * @param ae ignored
120.      */
121.     public void reset(ActionEvent ae) {
122.         this.name = "World";
123.         this.greeting = "Hello";
124.     }
125. 
126. }
         
     
     
    
    
        portlet.xml
    
    
There is no substantial change in portlet.xml against the Basic JSF Portlet Development chapter. Only <description>, <portlet-name>, <display-name> and <title> have been changed.    
    
                    portlet.xml
                
        <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd
   http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
    <portlet>
        <description>A simple portlet usinf JSF2 and RF4.</description>
        <portlet-name>jsf2Rf4HelloWorldPortlet</portlet-name>
        <display-name>JSF2+RF4 Hello World Portlet</display-name>
        <portlet-class>javax.portlet.faces.GenericFacesPortlet</portlet-class>
        <init-param>
            <name>javax.portlet.faces.defaultViewId.view</name>
            <value>/pages/main.xhtml</value>
        </init-param>
        <init-param>
            <name>javax.portlet.faces.defaultViewId.edit</name>
            <value>/pages/edit.xhtml</value>
        </init-param>
        <init-param>
            <name>javax.portlet.faces.defaultViewId.help</name>
            <value>/pages/help.xhtml</value>
        </init-param>
        <init-param>
            <name>javax.portlet.faces.preserveActionParams</name>
            <value>true</value>
        </init-param>
        <expiration-cache>0</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
            <portlet-mode>VIEW</portlet-mode>
            <portlet-mode>EDIT</portlet-mode>
            <portlet-mode>HELP</portlet-mode>
        </supports>
        <portlet-info>
            <title>JSF2+RF4 Hello World Portlet</title>
        </portlet-info>
        <container-runtime-option>
            <name>org.gatein.pc.remotable</name>
            <value>true</value>
        </container-runtime-option>
    </portlet>
</portlet-app>
         
     
     
    
    
        web.xml
    
    
We set a few more init-params in web.xml for RichFaces components to work:    
    
                    web.xml
                
        <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
    <display-name>jsf2-rf4-hello-world-portlet</display-name>
    <context-param>
        <description>See https://docs.jboss.org/author/display/PBR/Installing+Portlet+Bridge#InstallingPortletBridge-DisableautomaticinclusionofPortletBridge</description>
        <param-name>org.gatein.portletbridge.WAR_BUNDLES_PORTLETBRIDGE</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <description>See https://docs.jboss.org/author/display/PBR/Render+Policy</description>
        <param-name>javax.portlet.faces.RENDER_POLICY</param-name>
        <param-value>ALWAYS_DELEGATE</param-value>
    </context-param>
    
    <!-- The following params are documented here: http://myfaces.apache.org/core21/myfaces-impl/webconfig.html -->
    <context-param>
        <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
        <param-value>*.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <!-- Change to Production to compress js files, etc. -->
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <description>http://docs.jboss.org/richfaces/latest_4_X/Developer_Guide/en-US/html/chap-Developer_Guide-Skinning_and_theming.html</description>
        <param-name>org.richfaces.skin</param-name>
        <param-value>#{skinBean.skin}</param-value>
    </context-param>
    <context-param>
        <description>See http://docs.jboss.org/richfaces/latest_4_X/Developer_Guide/en-US/html/chap-Developer_Guide-Advanced_features.html</description>
        <param-name>org.richfaces.resourceOptimization.enabled</param-name>
        <param-value>true</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <mime-mapping>
        <extension>xcss</extension>
        <mime-type>text/css</mime-type>
    </mime-mapping>
</web-app>